package chapter05;//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
//解题思路
//1,把八皇后看作一维数组,int[] array;一维数组的空间大小 8
//2,分别向arr[index] ,arr[1],arr[2] ......index分别表示第几列,arr[1]填充数字值 0-7
//3,将数字填入后,检查是否符合条件,第一列 index=0 第一列上的值 arr[0]=0;
//4,将满足的数字填入到一维数组,并且将计数器累加
//5, 需要递归多次判断


//写方法递归检查是否满足八皇后的条件,默认从第0列开始
//
public class Queen8 {
    int max = 8;
    int[] array;
    static int count = 0;

    Queen8() {
        this.array = new int[this.max];
    }

    public static void main(String[] var0) {
        Queen8 var1 = new Queen8();
//
        var1.check(0);
        System.out.println("一共有" + count + "种解法");
    }

    //    递归方法check()
//第一个为0 ,满足条件
//    第一个从0开始判断是否满足 1
    private void check(int var1) {
//        递归结束条件,数组是没有第八列的,
//        array={0,?,?,?}
        if (var1 == this.max) {
            this.print();
        } else {
//            这里需要++var2
//            循环填充数字,并且判断是否符合八皇后
            for (int var2 = 0; var2 < this.max; ++var2) {
//                把数字0赋值给arr[0]
//                array={0,0,0,0,0,0,0,0}.默认值不符合田间

                this.array[var1] = var2;
//                默认第一个数可以填充任何值
                if (this.judge(var1)) {
//                    递归
                    this.check(var1 + 1);//1 ,这个是控制一维数组下标移动的
                }
            }

        }
    }

    private boolean judge(int var1) {

//                      一开始 0<0  ---->         0 < 1
        for (int var2 = 0; var2 < var1; ++var2) {
//判断条件 比如 从第0列开始,第一个数 为0 ,
//            第二列 从0开始到7 ,继续填充数值
//            数组的第一个数填充 0了 ,第二个数不能填充0 ,必须是不能同一行 ,同一列
//            Math.abs(var1 - var2) == Math.abs(this.array[var1] - this.array[var2])
//                                           0-1
//            [0,2]  var1=0   var2=2
            if (this.array[var2] == this.array[var1] || Math.abs(var1 - var2) == Math.abs(this.array[var1] - this.array[var2])) {
                return false;
            }
        }

        return true;
    }

    private void print() {
        ++count;

        for (int var1 = 0; var1 < this.array.length; ++var1) {
            System.out.print(this.array[var1] + " ");
        }

        System.out.println();
    }
}
